#pragma once
#include <iostream>
#include <cstdarg>
#include <cstdio>
#include <ctime>
#include <string>

// 日志是有日志级别的
#define DEBUG 0
#define NORMAL 1
#define WARNING 2
#define ERROR 3
#define FATAL 4 // 致命错误

const char* gLevelMap[] = {
    "DEBUG",
    "NORMAL",
    "WARNING",
    "ERROR",
    "FATAL"
};

#define LOGFILE "./log.txt"

// 写日志包括: 日志等级  时间  支持用户自定义输入
void logMessage(int level, const char* format, ...)  // 可变参数
{
#ifndef DEBUG_SHOW
    if (level == DEBUG) return ;
#endif

    char stdbuffer[1024]; // 标准部分
    time_t timestamp = time(nullptr);
    snprintf(stdbuffer, sizeof stdbuffer, "[%s] [%d]", gLevelMap[level], timestamp);

    char logBuffer[1024]; // 自定义部分
    va_list args; // 定义
    va_start(args, format); // 确定起始地址,用来处理可变参数列表
    vsnprintf(logBuffer, sizeof logBuffer, format, args);  // vprintf -> 往显示器打印  vfprintf -> 往文件里打印  vsprintf -> 往字符串里打印
    va_end(args); // 关闭

    // 把日志写在文件中
    FILE* fp = fopen(LOGFILE, "a");  // a 是追加写
    fprintf(fp, "%s | %s\n", stdbuffer, logBuffer); // 把日志写到文件中

    // 把日志打印出来
    printf("%s %s\n", stdbuffer, logBuffer);
    fclose(fp);
}
